/*
 * Contexto.cpp
 *
 *  Created on: 29/05/2012
 *      Author: natuchis
 */

#include "Contexto.h"

Contexto::Contexto() {

	this->mapaCtx = new map <char, Caracter>;
	this->cantTotalFrec = 0;
}


Contexto::~Contexto() {

	delete this->mapaCtx;
}


void Contexto::agregarCaracter(char carac) {

	this->mapaCtx->insert(pair<char,Caracter>(carac, Caracter()));
	this->cantTotalFrec++;
}


bool Contexto::existeCaracter(char carac) {

	this->itMapaCtx = this->mapaCtx->find(carac);
	return (this->itMapaCtx != this->mapaCtx->end());
}


unsigned long int Contexto::getFrecuenciaTotal() const {

	return this->cantTotalFrec;
}


void Contexto::setExcluidos(set<char> *excluidos) {

	for (this->itMapaCtx = this->mapaCtx->begin(); this->itMapaCtx != this->mapaCtx->end(); this->itMapaCtx++) {
			excluidos->insert(this->itMapaCtx->first);
	}
}


unsigned long int Contexto::getFrecuenciaTotalExcluidos(set<char> *excluidos) {

	set<char>::iterator it;
	unsigned long int frecExcluidos = 0;

	for (it = excluidos->begin(); it != excluidos->end(); it++) {
		if (this->existeCaracter(*it)) {
			frecExcluidos += this->mapaCtx->find(*it)->second.getFrecuencia();
		}
	}
	return frecExcluidos;
}


void Contexto::actualizarContexto(char carac) {

	if (this->existeCaracter(carac)) {
		this->mapaCtx->find(carac)->second.incrementarFrecuencia();
		this->cantTotalFrec++;
//		cout << "Incremente frecuencia del caracter: " << carac << " en el modelo actual" << endl;
	}
	else {
		this->agregarCaracter(carac);
//		cout << "Agregue el caracter: " << carac << " en modelo actual" << endl;
	}
}

unsigned long int Contexto::getFrecuenciaEsc() const {

	unsigned long int frec;
	if (this->mapaCtx->empty()) {
		frec = 1;
	}
	else {
		frec = this->mapaCtx->size();
	}
	return frec;
}


unsigned long int Contexto::getCantExcluidosPresentesEnContexto(set<char> *excluidos){

	set<char>::iterator it;
	unsigned long int frecExcluidos = 0;

	for (it = excluidos->begin(); it != excluidos->end(); it++) {
		if (this->existeCaracter(*it)) {
			frecExcluidos++;
		}
	}
	return frecExcluidos;
}


void Contexto::agregarCaracteresNoExcluidos(map<string, Caracter> &mapa, set<char> *excluidos) {

	for (this->itMapaCtx = this->mapaCtx->begin(); this->itMapaCtx != this->mapaCtx->end(); this->itMapaCtx++) {
		if (excluidos->find(this->itMapaCtx->first) == excluidos->end()) {
			mapa.insert(pair<string,Caracter>(string(1,this->itMapaCtx->first),this->itMapaCtx->second));
		}
	}
}

void Contexto::getMapa (map<string,Caracter> &mapa, set<char> *excluidos) {

	this->agregarCaracteresNoExcluidos(mapa,excluidos);
}
